import java.util.Random;
import java.util.HashMap;
import java.util.Set;

public class KantineSimulatie
{
    // kantine
    private Kantine kantine;
    
    // Kantine aanbod
    private KantineAanbod kantineAanbod;
    
    // Random number generator
    private Random random;
    
    // aantal artikel
    private static final int AANTAL_ARTIKELEN = 4;
    
    // artikelen
    private static final String[] artikelnamen =
        new String[] {"Koffie", "Broodje Hamburger", "Broodje Kaas", "Melk"};
    
    // Prijzen
    private static double[] artikelprijzen =
        new double[] {1.50, 2.10, 1.65, 1.65};
    
    // Minimum en Maximum aantal artikelen per soort
    private static final int MIN_ARTIKELEN_PER_SOORT = 10000;
    private static final int MAX_ARTIKELEN_PER_SOORT = 20000;
    
    // minimum en maximum aantal personen per dag
    private static final int MIN_PERSONEN_PER_DAG = 50; 
    private static final int MAX_PERSONEN_PER_DAG = 100; 
 
    // minimum en maximum artikelen per persoon 
    private static final int MIN_ARTIKELEN_PER_PERSOON = 1; 
    private static final int MAX_ARTIKELEN_PER_PERSOON = 4; 
 
    /** 
     * Constructor 
     */ 
    public KantineSimulatie()  
    { 
        kantine = new Kantine(); 
        random = new Random(); 
        
        int[] hoeveelheden = getRandomArray(
            AANTAL_ARTIKELEN, MIN_ARTIKELEN_PER_SOORT, MAX_ARTIKELEN_PER_SOORT);
        
        kantineAanbod = new KantineAanbod(artikelnamen, artikelprijzen, hoeveelheden);
        kantine.setKantineAanbod(kantineAanbod); 
    } 
 
    /** 
     * Methode om een array van random getallen liggend tussen min en max  
     * van de gegeven lengte te genereren 
     * @param lengte 
     * @param min 
     * @param max 
     * @return De array met random getallen 
     */ 
    private int[] getRandomArray(int lengte, int min, int max)  
    { 
        int[] temp=new int[lengte]; 
        for(int i = 0; i < lengte; i++) { 
            temp[i] = getRandomValue(min, max); 
        } 
        return temp; 
    } 
 
    /** 
     * Methode om een random getal tussen min(incl) en max(incl) te genereren. 
     * @param min 
     * @param max 
     * @return Een random getal 
     */ 
    private int getRandomValue(int min, int max)  
    { 
        return random.nextInt(max - min + 1) + min; 
    } 
 
    /** 
     * Methode om op basis van een array van indexen voor de array  
     * artikelnamen de bijhorende array van artikelnamen te maken 
     * @param indexen 
     * @return De array met artikelnamen 
     */ 
    private String[] geefArtikelNamen(int[] indexen)  
    { 
        String[] artikelen=new String[indexen.length]; 
        for(int i = 0; i < indexen.length; i++)  
        {  
            artikelen[i] = artikelnamen[indexen[i]]; 
        } 
        return artikelen; 
    } 
 
/** 
 * Deze methode simuleert een aantal dagen in het verloop van de kantine 
 * @param dagen 
 */ 
public void simuleer(int dagen)  
{ 
    // for lus voor dagen 
    for(int i = 0; i < dagen; i++) { 
        // bedenk hoeveel personen vandaag binnen lopen 
        int aantalpersonen = getRandomValue(MIN_PERSONEN_PER_DAG, MAX_PERSONEN_PER_DAG);
         
        // laat de personen maar komen
        for(int j = 0; j < aantalpersonen; j++) {
            // maak persoon en dienblad aan, koppel ze 
            Persoon persoon = new Persoon();
            Dienblad dienblad = new Dienblad();
            persoon.pakDienblad(dienblad);
             
            // bedenk hoeveel artikelen worden gepakt 
            int aantalartikelen = getRandomValue(MIN_ARTIKELEN_PER_PERSOON, MAX_ARTIKELEN_PER_PERSOON);

            // genereer de “artikelnummers”, dit zijn indexen  
            // van de artikelnamen array   
            int[] tepakken = getRandomArray(aantalartikelen, 0, AANTAL_ARTIKELEN - 1); 

            // vind de artikelnamen op basis van de indexen hierboven 
            String[] artikelen = geefArtikelNamen(tepakken); 
             
            // loop de kantine binnen, pak de gewenste artikelen
            for(int k = 0; k < artikelen.length; k++) {
                dienblad.voegToe(kantineAanbod.getArtikel(artikelen[k]));
            }
            
            // Sluit achteraan
            kantine.getKassa().getKassaRij().sluitAchteraan(persoon);
        } 

        // verwerk rij voor de kassa 
        kantine.verwerkRijVoorKassa();

        // druk de dagtotalen af en hoeveel personen binnen zijn gekomen 
        System.out.println("Aantal verkochte producten: "+kantine.getKassa().aantalArtikelen());
        System.out.println("Geld in kassa:              "+kantine.getKassa().hoeveelheidGeldInKassa());
         
        // reset de kassa voor de volgende dag 
        kantine.getKassa().resetKassa();
        kantineAanbod.vulAanbod(MIN_ARTIKELEN_PER_SOORT);
        //showVoorraad();
    } 
}
    
    public void showVoorraad()
    {
        System.out.println("Voorraad:");
        HashMap<String, String> voorraad = kantineAanbod.getVoorraad();
        Set<String> keys = voorraad.keySet();
        for (String key: keys) {
            System.out.println(voorraad.get(key) + " " + key);
        }        
        
    }
    /*
    public int aantalVanArtikel(String naam)
    {
        return kantineAanbod.aantalVanArtikel(naam);
    }
    */
}
